<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>事件发布-订阅管理器</title>
</head>
<body>
	<script src="../dist/observer-manager.min.js"></script>
	<script>
		// 一个函数作用域
		var Child = class {}
		var childInstance = new Child()
		// 事件模型列表
		const eventModuleConfig = {
		  game: [
		    { name: 'runEvent', desc: '触发跑步事件', order: 'asc', fireData: { name: '', address: '', date: '' } },
		    { name: 'swimEvent', desc: '触发游泳事件', order: 'desc', fireData: {} }
		  ]
		}
		// 初始化事件加载器，传入事件模型
		const ObserverManager = new ObserverManagerLibrary(eventModuleConfig)
		// 事件 handler 执行函数
		const runHandler = function (a, b, { name, date }) {
		  console.info('run', a, b, name, date);
		}
		// 在 window 环境下注册事件，将 handler 函数绑定到 window 环境下执行，传参1和3
		ObserverManager.add('game/runEvent', runHandler, window, window, 1, 3)
		// 注册单次事件，传参2和3
		ObserverManager.addOnce('game/runEvent', runHandler, window, window, 2, 3)

		setTimeout(() => {
		  console.info('触发事件')
		  // 触发 window 环境下的 game/runEvent 事件
		  ObserverManager.fire('game/runEvent', window, { name: '小明', date: '6-01' })
		  console.info('======')
		  // 触发 window 环境下的 game/runEvent 事件，addOnce 注册的事件不在执行因为上一个 fire 已经执行掉了
		  ObserverManager.fire('game/runEvent', window, { name: '小明', date: '6-02' })
		}, 500);
		
		// 事件 handler2 执行函数
		const runHandler2 = function (a, b, c) {
		  console.info('run', a, b, c);
		}

		setTimeout(() => {
		  console.info('-------------');
		  // 触发 window 环境下的 game/runEvent 事件
		  ObserverManager.fire('game/runEvent', window, { name: '小明', distance: 200 })
		  // 注册 child 函数作用域环境下的 game/runEvent 事件，runHandler2 绑定到 window 环境下 （不会触发 window 环境下的 game/runEvent 事件）
		  ObserverManager.add('game/runEvent', runHandler2, childInstance, window, 2, 6)
		  console.info('-------------');
		  // 触发 child 函数作用域环境下的 game/runEvent 事件
		  ObserverManager.fire('game/runEvent', childInstance, { name: '小红' })
		}, 1500);

		setTimeout(() => {
		  const beforeEvents = ObserverManager.getEvents(window)
		  console.info('销毁前 window 环境中事件列表 ', beforeEvents)
		  // 注销 window 作用域下某个事件
		  ObserverManager.off('game/runEvent', window)
		  // 销毁所有事件集合
		  ObserverManager.clear()
		  const afterEvents = ObserverManager.getEvents(window)
		  console.info('销毁后 window 环境中事件列表 ', afterEvents)
		}, 3000);

		// 输出结果：
		/**
		 * 触发事件
		 * run 1 3 5  （window环境）
		 * run 2 3 5  （window环境）
		 * ======
		 * run 1 3 15 （window环境）
		 * -------------
		 * run 1 3 10 （window环境）
		 * -------------
		 * run 2 6     （child环境）
		 */
	</script>
</body>
</html>